home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / QuickDraw3D 1.6 SDK / Mac SampleCode New for 1.6 / CullGroupSample / Source / Misc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-18  |  8.0 KB  |  416 lines  |  [TEXT/CWIE]

  1. /****************************/
  2. /*      MISC ROUTINES       */
  3. /* By Brian Greenstone      */
  4. /****************************/
  5.  
  6.  
  7. /***************/
  8. /* EXTERNALS   */
  9. /***************/
  10. #include <Events.h>
  11. #include <Dialogs.h>
  12. #include <Processes.h>
  13. #include <NumberFormatting.h>
  14.  
  15. #include <QD3D.h>
  16. #include <QD3DErrors.h>
  17.  
  18. #include <timer.h>
  19. #include <math.h>
  20.  
  21. #include "myglobals.h"
  22. #include "misc.h"
  23. #include "main.h"
  24.  
  25.  
  26. /****************************/
  27. /*    CONSTANTS             */
  28. /****************************/
  29.  
  30. #define        ERROR_ALERT_ID        401
  31.  
  32. /**********************/
  33. /*     VARIABLES      */
  34. /**********************/
  35.  
  36. KeyMap gKeyMap,gOldKeyMap;
  37.  
  38. unsigned long    gTick = 0;
  39.  
  40.  
  41. unsigned long seed0 = 0, seed1 = 0, seed2 = 0;
  42.  
  43. /****************** DO SYSTEM ERROR ***************/
  44.  
  45. void ShowSystemErr(long err)
  46. {
  47. Str255        numStr;
  48.  
  49.     NumToString(err, numStr);
  50.     DoAlert (numStr);
  51.     CleanQuit();
  52. }
  53.  
  54. /*********************** DO ALERT *******************/
  55.  
  56. void DoAlert(Str255 s)
  57. {
  58.     ParamText(s,NIL_STRING,NIL_STRING,NIL_STRING);
  59.     NoteAlert(ERROR_ALERT_ID,NIL_POINTER);
  60. }
  61.         
  62. /*********************** DO FATAL ALERT *******************/
  63.  
  64. void DoFatalAlert(Str255 s)
  65. {
  66.     ParamText(s,NIL_STRING,NIL_STRING,NIL_STRING);
  67.     NoteAlert(ERROR_ALERT_ID,NIL_POINTER);
  68.     CleanQuit();
  69. }
  70.  
  71. /************ CLEAN QUIT ***************/
  72.  
  73. void CleanQuit(void)
  74. {
  75.     ExitToShell();
  76. }
  77.  
  78. /********************** WAIT **********************/
  79.  
  80. void Wait(long ticks)
  81. {
  82. long    start;
  83.     
  84.     start = TickCount();
  85.  
  86.     while ((TickCount()-start) < ticks)
  87.         ; 
  88.  
  89. }
  90.  
  91. /**************************** LOAD A FILE *******************/
  92.  
  93. Handle    LoadAFile(Str255 fileName, short volumeRefNum, long *fileSize)
  94. {
  95. OSErr        iErr;
  96. short        fRefNum;
  97. Handle        fileHandle;
  98.  
  99.                     /*  OPEN THE FILE */
  100.                 
  101.     iErr = FSOpen(fileName,volumeRefNum,&fRefNum);            // open file                
  102.     if (iErr != noErr)
  103.         DoFatalAlert("\pCant Open File!");
  104.                             
  105.                     /* GET MEMORY FOR FILE */
  106.                         
  107.     if    (GetEOF(fRefNum,fileSize) != noErr)            // get size of text file
  108.         DoFatalAlert("\pError reading File!");
  109.  
  110.     if ((fileHandle = NewHandle(*fileSize)) == NIL_POINTER)
  111.         DoFatalAlert ("\pNo Memory for File!");
  112.     HLock(fileHandle);
  113.  
  114.                     /*    READ THE DATA */
  115.                 
  116.     iErr = FSRead(fRefNum,fileSize,*fileHandle);
  117.     if (iErr != noErr)
  118.         DoFatalAlert ("\pError Reading File!");
  119.         
  120.                     /*  CLOSE THE FILE */
  121.                 
  122.     iErr = FSClose(fRefNum);
  123.     if (iErr != noErr)
  124.         DoFatalAlert ("\pCant close file!");
  125.     
  126.     return (fileHandle);    
  127. }
  128.  
  129. /***************** NUM TO HEX *****************/
  130. //
  131. // NumToHex - fixed length, returns a C string
  132. //
  133.  
  134. unsigned char *NumToHex(unsigned short n)
  135. {
  136. static unsigned char format[] = "0xXXXX";                // Declare format static so we can return a pointer to it.
  137. char *conv = "0123456789ABCDEF";
  138. short i;
  139.  
  140.     for (i = 0; i < 4; n >>= 4, ++i)
  141.             format[5 - i] = conv[n & 0xf];
  142.     return format;
  143. }
  144.  
  145.  
  146. /***************** NUM TO HEX 2 **************/
  147. //
  148. // NumToHex2 -- allows variable length, returns a ++PASCAL++ string.
  149. //
  150.  
  151. unsigned char *NumToHex2(unsigned long n, short digits)
  152. {
  153. static unsigned char format[] = "\p$XXXXXXXX";                // Declare format static so we can return a pointer to it
  154. char *conv = "0123456789ABCDEF";
  155. unsigned long i;
  156.  
  157.     if (digits > 8 || digits < 0)
  158.             digits = 8;
  159.     format[0] = digits + 1;                            // adjust length byte of output string
  160.  
  161.     for (i = 0; i < digits; n >>= 4, ++i)
  162.             format[(digits + 1) - i] = conv[n & 0xf];
  163.     return format;
  164. }
  165.  
  166.  
  167. /*************** NUM TO DECIMAL *****************/
  168. //
  169. // NumToDecimal --  returns a ++PASCAL++ string.
  170. //
  171.  
  172. unsigned char *NumToDec(unsigned long n)
  173. {
  174. static unsigned char format[] = "\pXXXXXXXX";                // Declare format static so we can return a pointer to it
  175. char *conv = "0123456789";
  176. short         i,digits;
  177. unsigned long temp;
  178.  
  179.     if (n < 10)                                        // fix digits
  180.         digits = 1;
  181.     else if (n < 100)
  182.         digits = 2;
  183.     else if (n < 1000)
  184.         digits = 3;
  185.     else if (n < 10000)
  186.         digits = 4;
  187.     else if (n < 100000)
  188.         digits = 5;
  189.     else
  190.         digits = 6;
  191.  
  192.     format[0] = digits;                                // adjust length byte of output string
  193.  
  194.     for (i = 0; i < digits; ++i)
  195.     {
  196.         temp = n/10;
  197.         format[digits-i] = conv[n-(temp*10)];
  198.         n = n/10;
  199.     }
  200.     return format;
  201. }
  202.  
  203.  
  204.  
  205. /*************** ABSOLUTE ********************/
  206.  
  207. float Absolute(float f)
  208. {
  209.     if (f < 0)
  210.         return(-f);
  211.     else
  212.         return(f);
  213. }
  214.  
  215. /******************** REGULATE SPEED  ***************/
  216.  
  217. void RegulateSpeed(long speed)
  218. {
  219.     while ((TickCount() - gTick) < speed)                // wait for 1 tick
  220.         ;
  221.     gTick = TickCount();                            // remember current time
  222. }
  223.  
  224. /******************** MY RANDOM LONG **********************/
  225. //
  226. // My own random number generator that returns a LONG
  227. //
  228. // NOTE: call this instead of MyRandomShort if the value is going to be
  229. //        masked or if it just doesnt matter since this version is quicker
  230. //        without the 0xffff at the end.
  231. //
  232.  
  233. unsigned long MyRandomLong(void)
  234. {
  235.   return seed2 ^= (((seed1 ^= (seed2>>5)*1568397607UL)>>7)+
  236.                    (seed0 = (seed0+1)*3141592621UL))*2435386481UL;
  237. }
  238.  
  239.  
  240. /**************** SET MY RANDOM SEED *******************/
  241.  
  242. void SetMyRandomSeed(unsigned long seed)
  243. {
  244.     seed0 = seed;
  245.     seed1 = 0;
  246.     seed2 = 0;    
  247. }
  248.  
  249. /************************* RANDOM RANGE *************************/
  250.  
  251. unsigned short    RandomRange(unsigned short min, unsigned short max)
  252. {
  253. register    unsigned short        qdRdm;                            // treat return value as 0-65536
  254. register    unsigned long        range, t;
  255.  
  256.     qdRdm = MyRandomLong()&0xffff;
  257.     range = max+1 - min;
  258.     t = (qdRdm * range)>>16;                                 // now 0 <= t <= range
  259.     
  260.     return( t+min );
  261. }
  262.  
  263.  
  264.  
  265.  
  266. /******************* FLOAT TO STRING *******************/
  267.  
  268. void FloatToString(float num, Str255 string)
  269. {
  270. Str255    sf;
  271. long    i,f;
  272.  
  273.     i = num;                        // get integer part
  274.     
  275.     
  276.     f = (fabs(num)-fabs((float)i)) * 10000;        // reduce num to fraction only & move decimal --> 5 places    
  277.  
  278.     if ((i==0) && (num < 0))        // special case if (-), but integer is 0
  279.     {
  280.         string[0] = 2;
  281.         string[1] = '-';
  282.         string[2] = '0';
  283.     }
  284.     else
  285.         NumToString(i,string);        // make integer into string
  286.         
  287.     NumToString(f,sf);                // make fraction into string
  288.     
  289.     string[++string[0]] = '.';        // add "." into string
  290.     
  291.     if (f >= 1)
  292.     {
  293.         if (f < 1000)
  294.             string[++string[0]] = '0';    // add 1000's zero
  295.         if (f < 100)
  296.             string[++string[0]] = '0';    // add 100's zero
  297.         if (f < 10)
  298.             string[++string[0]] = '0';    // add 10's zero
  299.     }
  300.     
  301.     for (i = 0; i < sf[0]; i++)
  302.     {
  303.         string[++string[0]] = sf[i+1];    // copy fraction into string
  304.     }
  305. }
  306.  
  307. /****************** ALLOC HANDLE ********************/
  308.  
  309. Handle    AllocHandle(long size)
  310. {
  311. Handle    hand;
  312. OSErr    err;
  313.  
  314.     hand = NewHandle(size);                            // alloc in APPL
  315.     if (hand == nil)
  316.     {
  317.         hand = TempNewHandle(size,&err);            // try TEMP mem
  318.         if (hand == nil)
  319.         {
  320.             return(NewHandleSys(size));            // use SYS        
  321.         }
  322.         else
  323.             return(hand);                            // use TEMP
  324.     }
  325.     else
  326.         return(hand);                                // use APPL
  327. }
  328.  
  329.  
  330. /****************** ALLOC PTR ********************/
  331.  
  332. Ptr    AllocPtr(long size)
  333. {
  334. Ptr    pr;
  335.  
  336.     pr = NewPtr(size);                        // alloc in APPL
  337.     if (pr == nil)
  338.     {
  339.         return(NewPtrSys(size));            // alloc in SYS
  340.     }
  341.     else
  342.         return(pr);
  343. }
  344.  
  345.  
  346. /***************** ANGLE TO VECTOR ******************/
  347. //
  348. // Returns a normalized 2D vector based on a radian angle
  349. //
  350.  
  351. void AngleToVector(float angle, TQ3Vector2D *theVector)
  352. {
  353.     theVector->x = -sin(angle);
  354.     theVector->y = -cos(angle);
  355. }
  356.  
  357.  
  358. /************************** VECTORS ARE CLOSE ENOUGH ****************************/
  359.  
  360. Boolean VectorsAreCloseEnough(TQ3Vector3D *v1, TQ3Vector3D *v2)
  361. {
  362.     if (fabs(v1->x - v2->x) < 0.04)
  363.         if (fabs(v1->y - v2->y) < 0.04)
  364.             if (fabs(v1->z - v2->z) < 0.04)
  365.                 return(true);
  366.  
  367.     return(false);
  368. }
  369.  
  370. /************************** POINTS ARE CLOSE ENOUGH ****************************/
  371.  
  372. Boolean PointsAreCloseEnough(TQ3Point3D *v1, TQ3Point3D *v2)
  373. {
  374.     if (fabs(v1->x - v2->x) < 0.04)
  375.         if (fabs(v1->y - v2->y) < 0.04)
  376.             if (fabs(v1->z - v2->z) < 0.04)
  377.                 return(true);
  378.  
  379.     return(false);
  380. }
  381.  
  382. /************************** UVS ARE CLOSE ENOUGH ****************************/
  383.  
  384. Boolean UVsAreCloseEnough(TQ3Param2D *v1, TQ3Param2D *v2)
  385. {
  386.     if (fabs(v1->u - v2->u) < 0.01)
  387.         if (fabs(v1->v - v2->v) < 0.01)
  388.             return(true);
  389.  
  390.     return(false);
  391. }
  392.  
  393.  
  394. /************* COPY PSTR **********************/
  395.  
  396. void CopyPStr(ConstStr255Param    inSourceStr, StringPtr    outDestStr)
  397. {
  398. short    dataLen = inSourceStr[0] + 1;
  399.     
  400.     BlockMoveData(inSourceStr, outDestStr, dataLen);
  401.     outDestStr[0] = dataLen - 1;
  402. }
  403.  
  404.  
  405.  
  406.  
  407.  
  408.  
  409.  
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416.